﻿using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;

namespace ConcurrentQueueDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            ProducerConsumerExample example = new ProducerConsumerExample();

            for(int i = 0; i<100 ;i++)
            {
                Task.Run(example.ProducerThread);
                Task.Run(example.ConsumerThread);
            }
            Console.WriteLine("Hello World!");
        }
    }

    public class ProducerConsumerExample
    {
        // 定义一个 ConcurrentQueue 用于存储数据  
        private ConcurrentQueue<int> _queue = new ConcurrentQueue<int>();

        // 生产者线程方法  
        public void ProducerThread()
        {
            while (true)
            {
                // 模拟生产数据  
                int data = GetNextData();
                // 将数据放入队列中  
                _queue.Enqueue(data);
                Console.WriteLine($"Producer added {data} to the queue.");
                Thread.Sleep(1000); // 模拟工作耗时  
            }
        }

        // 消费者线程方法  
        public void ConsumerThread()
        {
            while (true)
            {
                // 从队列中获取数据  
                int data;
                if (_queue.TryDequeue(out data))
                {
                    // 处理数据  
                    ProcessData(data);
                    Console.WriteLine($"Consumer processed {data} from the queue.");
                    Thread.Sleep(500); // 模拟工作耗时  
                }
                else
                {
                    // 队列为空时等待一会儿再尝试获取数据  
                    Thread.Sleep(500);
                }
            }
        }

        // 获取数据的模拟方法，根据实际情况替换实现方式  
        private int GetNextData()
        {
            return new Random().Next(1, 100); // 返回一个1到99之间的随机数作为示例数据  
        }

        // 处理数据的模拟方法，根据实际情况替换实现方式  
        private void ProcessData(int data)
        {
            // 在这里处理数据，例如写入日志、更新UI等。  
            Console.WriteLine($"处理数据:{data}");
        }
    }
}
